package yi.wuhenbot.Service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import yi.wuhenbot.Controller.BotController;
import yi.wuhenbot.dao.FishingShopMapper;
import yi.wuhenbot.dao.FishingUserMapper;
import yi.wuhenbot.dao.OrgUserServiceMapper;
import yi.wuhenbot.entity.Fishing.FishingConfig;
import yi.wuhenbot.entity.Fishing.FishingUser;

import java.util.Date;

/**
 * @author wuhen
 */
@Service("fishingUserService")
public class FishingUserService {
    @Autowired
    private FishingUserMapper fishingUserMapper;
    @Autowired
    private FishingShopMapper fishingShopMapper;
    @Autowired
    private OrgUserServiceMapper orgUserServiceMapper;
    @Autowired
    private FishingConfigService fishingConfigService;

    private static final Logger logger = LoggerFactory.getLogger(BotController.class);
    /**
     * 新增钓鱼用户-购买钓鱼许可证
     * @param userId 用户id
     * @return 影响行数
     */
    String content;
    public String insertFishingUser(String typeId,String type,String userId) {
        //检查用户是否存在
        if(fishingUserMapper.checkUserExist(userId)){
            content ="你都是钓鱼佬了还买个许可证？";
            return content;
        }

        //查询用户积分
        int points1 = orgUserServiceMapper.getPoints1(userId);
        // 检查用户积分是否足够
        if (points1<20){
            content="你积分不足，无法购买钓鱼许可证！";
            return content;
        }
        // 扣除用户积分20
        orgUserServiceMapper.setPoint1(userId,points1-20);
        fishingUserMapper.insertFishingUser(userId);
        content="钓鱼许可证已使用，赠送新手钓竿*1，鱼饵*3！";
        return content;
    }
    /**
     * 查询钓鱼用户信息
     * @param userId 用户id
     * @return 钓鱼用户
     */
    public String getFishingUser(String typeId,String type,String userId) {
        //检查用户是否存在
        if(!fishingUserMapper.checkUserExist(userId)){
            content ="许可证都没有买，你要查什么信息？";
            return content;
        }
        FishingUser fishingUser = fishingUserMapper.getFishingUser(userId);
        if (fishingUser.getFishing_lure()==null){
            fishingUser.setFishing_lure("暂无");
        }
        if (fishingUser.getAccessories()==null){
            fishingUser.setAccessories("暂无");
        }
        if (fishingUser.getFishing_rod()==null){
            fishingUser.setFishing_rod("暂无");
        }
        // Start_time时间格式化Tue Sep 09 01:35:02 CST 2025转为09-09 01:35:02
        String startTime = "";
        String waitTime = "";
        if (fishingUser.getStart_time()!=null){
            startTime = new java.text.SimpleDateFormat("MM-dd HH:mm:ss").format(fishingUser.getStart_time());
        }
        if (fishingUser.getWait_time()!=null){
            waitTime = new java.text.SimpleDateFormat("MM-dd HH:mm:ss").format(fishingUser.getWait_time());
        }
        // 还需等待时间：结束时间-当前时间=等待时间（结果是分钟）
        long currentTime = System.currentTimeMillis();
        String waitTimeStr = "";
        // 判断开始时间以及结束时间是否为空
        if (fishingUser.getStart_time()!=null&&fishingUser.getWait_time()!=null){
            // 判断当前时间是否大于结束时间
            if (currentTime>fishingUser.getWait_time().getTime()){
                waitTimeStr = "钓鱼已结束，可以提竿啦~";
            }else{
                // 计算等待时间：结束时间-当前时间=等待时间（结果是分钟）
                long waitTimeLong = fishingUser.getWait_time().getTime() - currentTime;
                // 转换为分钟+秒：4分39秒，先获取分钟，然后等待时间对60取余
                long waitTimeMin = waitTimeLong / (1000 * 60);
                long waitTimeSec = waitTimeLong % 60;
                // 等待时间不足60秒，添加0
                if (waitTimeSec<10){
                    waitTimeStr = waitTimeMin + "分钟0"+waitTimeSec+"秒";
                }else{
                    waitTimeStr = waitTimeMin + "分钟"+waitTimeSec+"秒";
                }
            }
        }else {
            waitTimeStr = "暂无";
        }
        content="钓鱼信息如下：\n"+
                "鱼竿："+fishingUser.getFishing_rod()+"\n"+
                "鱼饵："+fishingUser.getFishing_lure()+"\n"+
                "饰品："+fishingUser.getAccessories()+"\n"+
                "鱼饵数量："+fishingUser.getFishing_lure_num()+"\n"+
                "是否在钓鱼："+(fishingUser.getIs_fishing()==1?"是":"否")+"\n"+
                "开始钓鱼时间："+(startTime==""?"暂无":startTime)+"\n"+
                "钓鱼结束时间："+(waitTime==""?"暂无":waitTime)+"\n"+
                "还需等待时间："+waitTimeStr;
        return content;
    }
    /**
     * 开始钓鱼：指令抛竿
     * @param userId 用户id
     * @return 影响行数
     */
    public String startFishing(String typeId,String type, String userId) {
        // 钓鱼前检查
        // 检查用户是否存在
        if(!fishingUserMapper.checkUserExist(userId)){
            return "你还没有购买钓鱼许可证哦~";
        }
        // 检查用户鱼竿是否存在
        if(!fishingUserMapper.checkFishingRodExist(userId)){

            return "你没有鱼竿哦~";
        }
        // 检查用户鱼饵是否大于0
        if(!fishingUserMapper.checkFishingLineExist(userId)){
            content ="呀！你的鱼饵都没有了，去商店买吧~";
            return content;
        }
        // 检查用户是否在钓鱼
        if(fishingUserMapper.checkIsFishing(userId)){
            content ="你已经在钓鱼了，不能重复钓鱼~";
            return content;
        }
        // 生成当前时间：开始时间
        Date startTime = new Date();
        // 生成等待时间：10分钟后的时间
         Date waitTime = new Date(startTime.getTime() + 10 * 60 * 1000);
        // 测生成等待时间：5秒后的时间
        // Date waitTime = new Date(startTime.getTime() + 5 * 1000);
        fishingUserMapper.startFishing(userId,startTime,waitTime);
        // 获取当前鱼饵数量
        int fishingLureNum = fishingUserMapper.getFishingUser(userId).getFishing_lure_num();
        // 减少鱼饵数量
        fishingLureNum= fishingLureNum-1;
        // 更新鱼饵数量
        fishingUserMapper.updateFishingLine(userId,fishingLureNum,0);
        return "钓鱼开始了，等待10分钟后收竿~";
    }
    /**
     * 结束钓鱼：指令收竿
     * @param userId 用户id
     * @return 影响行数
     */
    public String endFishing(String typeId,String type,String userId) {
        // 检查用户是否存在
        if(!fishingUserMapper.checkUserExist(userId)){
            content ="你还没有购买钓鱼许可证哦~";
            return content;
        }
        // 检查用户是否在钓鱼
        if(!fishingUserMapper.checkIsFishing(userId)){
            content ="你没有在钓鱼哦~";
            return content;
        }
        // 检查用户等待时间是否到了
        if(new Date().getTime() > fishingUserMapper.getFishingUser(userId).getWait_time().getTime()){
            fishingUserMapper.endFishing(userId);
            // 获取钓鱼结果，先生成鱼类的id，再根据鱼的id获取鱼的信息
            int fishingConfigId = fishingConfigService.getFishingConfigByProbability();
            FishingConfig fishingConfig = fishingConfigService.getFishingConfigById(fishingConfigId);
            // 打印
            logger.info("鱼类信息"+fishingConfig.toString());
            // 计算获得的积分：fishingcode+大小（随机数max_size~min_size）
            // 大小：最大max_size，最小min_size
            int maxSize = fishingConfig.getMax_size();
            int minSize = fishingConfig.getMin_size();
            logger.info("鱼的最大大小："+maxSize);
            logger.info("鱼的最小大小："+minSize);
            // 大小：最大maxSize，最小minSize
            int size = (int)(Math.random()*(maxSize-minSize+1)+minSize);
            logger.info("鱼的大小："+size);

            // 计算获得的积分：fishingcode+大小（随机数max_size~min_size）
            int score = fishingConfig.getFishingcode()+size;
            // 增加用户积分
            int userScore = orgUserServiceMapper.getPoints1(userId);
            userScore = userScore+score;
            orgUserServiceMapper.setPoint1(userId,userScore);
            content ="钓鱼成功!\n"+
                    "获得:"+fishingConfig.getFishingname()+"\n" +
                    "种类:"+fishingConfig.getFishingtype()+"\n" +
                    "重量:"+size/2+"kg\n" +
                    "获得:"+score+"积分";
            return content;
        }else {
            // 计算等待时间：结束时间-当前时间=等待时间（结果是分钟）
            long waitTimeLong = fishingUserMapper.getFishingUser(userId).getWait_time().getTime() - new Date().getTime();
            // 转换为分钟+秒：4分39秒，先获取分钟，然后等待时间对60取余
            long waitTimeMin = waitTimeLong / (1000 * 60);
            long waitTimeSec = waitTimeLong % 60;
            // 等待时间不足60秒，添加0
            if (waitTimeSec<10){
                content ="等待时间未到，不能收竿~还需要等待"+waitTimeMin+"分钟0"+waitTimeSec+"秒";
            }else{
                content ="等待时间未到，不能收竿~\n" +
                        "还需要等待:"+waitTimeMin+"分钟"+waitTimeSec+"秒\n" +
                        "请稍后再收竿~";
            }
            return content;
        }
    }

    /**
     * 更新鱼饵数量
     * @param userId 用户id
     * @param lineNum 鱼饵数量
     * @return 影响行数
     */
    public int updateFishingLine(String userId,int fishingLureNum,int lineNum) {
        return fishingUserMapper.updateFishingLine(userId,fishingLureNum,lineNum);
    }

    /**
     * 检查用户是否存在
     * @param userId 用户id
     * @return 是否存在
     */
    public boolean checkUserExist(String userId) {
        return fishingUserMapper.checkUserExist(userId);
    }

    /**
     * 检查用户鱼竿是否存在
     * @param userId 用户id
     * @return 是否存在
     */
    public boolean checkFishingRodExist(String userId) {
        return fishingUserMapper.checkFishingRodExist(userId);
    }
    /**
     * 检查用户鱼饵是否大于0
     * @param userId 用户id
     * @return 是否存在
     */
    public boolean checkFishingLineExist(String userId) {
        return fishingUserMapper.checkFishingLineExist(userId);
    }

}
